定期的に EC2 インスタンスを停止・起動する仕組みの CloudFormation テンプレート
RDS 対応バージョンをリリースしました。詳しくは下記エントリをご参照ください。
こんにちは、藤本です。
先日、コスト削減を目的にステージング環境の EC2 インスタンスを夜間・土日に停止したいという要望があったので、CloudWatch Events と AWS Lambda を使って、定期的に EC2 インスタンスを停止、起動する仕組みを作りました。当ブログでも、その他ブログでもよく紹介されていますので、ソースコードの説明は省きます。今回はその仕組みをどの環境でも簡単にデプロイできるように CloudFormation テンプレート化しました。
仕組み
起動/停止それぞれの CloudWatch Events により、指定したcron形式の日時で Lambda が実行され、特定のタグが設定されたインスタンスが起動/停止されます。
ご利用は自己責任でお願いします。特にリトライ処理が実装されていないため、本番環境でのご利用はお控えください。
手順
- CloudFormation からデプロイする
- 対象となる EC2 インスタンスへタグを設定する
CloudFormation からデプロイする
下のボタンから CloudFormation の画面へ遷移します。
必要に応じて、リージョンを変更してください。
CloudFormation テンプレートは URL が入力されていますので、そのまま「Next」をクリックします。
パラメータを設定します。
デフォルト設定の場合、ec2-state-scheduler
:True
のタグが設定された EC2インスタンスを日本時間の月〜金の24時に停止し、月〜金の6時に起動します。平日の6時〜24時のみ起動している、ということになります。
パラメータ名 | 説明 | デフォルト値 |
---|---|---|
StartSchedule | 起動を実行するスケジュールをUTCタイムゾーンで cron 式で記述します。 cron 式についてはこちら | 0 21 ? * SUN-THU * |
StopSchedule | 停止を実行するスケジュールをUTCタイムゾーンで cron 式で記述します cron 式についてはこちら | 0 15 ? * MON-FRI * |
Ec2TagKey | 起動/停止したいEC2に設定するタグのキー | ec2-state-scheduler |
Ec2TagValue | 起動/停止したいEC2に設定するタグの値 | True |
設定したら「Next」をクリックします。
オプションはそのまま「Next」をクリックします。
チェックボックスをチェックし、「Next」をクリックします。(IAM を操作する場合は承認操作としてチェックボックスへのチェックが必要)
CloudFormation Stack の完了を待ちます。
EC2 インスタンスへタグを設定する
EC2 のタグ設定画面から対象となるインスタンスを選択し、CloudFormation のパラメータで設定したタグを設定します。
動作確認
停止、起動の動作を確認します。
CloudWatch Events の時間を調整しました。25分に停止、30分に起動するように設定しました。
しばし、放置。。
CloudTrail から実行状態を確認します。
CloudTrail に 25分に StopInstances、30分に StartInstances が記録されています。
まとめ
AWS の機能を使えば、このようなジョブ処理も簡単に実装できます。仕組みも、ソースコードもシンプルなので必要に応じて修正していただければと思います。特にリトライ処理は含まれていませんので、Step Functions を組み合わせて実装するのがいいと思います。ただ Step Functions はまだ CloudFormation が対応していませんので、手設定で付け加える必要があります。